package cn.tedu.design;



import cn.tedu.spring.Hello;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/*《模拟SpringIoC的实现》
开发步骤
创建容器管理bean类,描述类的属性：key和class即【类名】和【类的全路径】 ; [user,dept,hello]
创建spring容器,并初始化容器; {hello=new Hello(),user=new Uer() }
提供getBean()方法,根据bean的名字,从spring容器中获取对应的对象
*/
public class SpringContext {
/**模拟spring框架,是spring的核心**/
    public static void main(String[] args) throws Exception {
        SpringContext sc = new SpringContext();
        Kiss k = (Kiss) sc.getBean("kiss");//根据类名获取类的对象
        System.out.println(k);//cn.tedu.design.Kiss@a09ee92

        k.say();

        Object o = sc.getBean("hello");
        Hello h = (Hello) o;
        System.out.println(h);
        h.hi();
    }
            //1,通过List集合创建容器管理、存放bean
    private final List <Bean>  beans = new ArrayList<>(); //把Bean封装类传入泛型   beans==>list
           //  无参构造(与类同名) 并初始化容器
                public  SpringContext() throws Exception {
                    //创建多个bean对象及属性,add加入容器
                    Bean b = new Bean("kiss","cn.tedu.design.Kiss");
                    beans.add(b);
                    /*******************************/
                    Bean b2 = new Bean();
                    b2.setName("hello");
                    b2.setPath("cn.tedu.spring.Hello");//全路径
                    beans.add(b2);

                    init(); //初始化
                }
            //2.创建map集合，存入对象;
            private final   Map<String,Object>  map  =   new HashMap<>();
            public  void init() throws Exception {
                    //增强for循环遍历，并获取map的key和value
                for (Bean be:beans
                     ) {
                    String key = be.getName();//key

                    String path = be.getPath();//value
                    Object value = Class.forName(path).newInstance();//没有创建对象会报空指针异常

                    map.put(key,value);
                }

            }
            //3,调用getBean()方法并传参 ；把map获取的参数返回对象       // 有就直接取出来,没有就创建并放入容器
           public  Object getBean(String s){
                return map.get(s);//去map里根据key找value
           }

}
